#include "Escena.h"

#define PI 3.14159265

Escena::Escena()
	{
	this->ruedaPrincipal = new RuedaPrincipal();
	this->soporte = new Soporte(15,15);
	this->camaraEnCabina = false;
	this->camara = new Camara();
	this->tiempoDurEscena = 0;
	}


Escena::~Escena()
	{
	delete this->ruedaPrincipal;
	delete this->soporte;
	delete this->camara;
	}

int Escena::getTiempoDurEscena() const
	{
	return this->tiempoDurEscena;
	}

void Escena::setTiempoDurEscena(int tiempo)
	{
	this->tiempoDurEscena = tiempo;
	}

bool Escena::isCamaraEnCabina()
	{
	return this->camaraEnCabina;
	}

void Escena::setCamaraEnCabina(bool camaraEnCabina)
	{
	this->camaraEnCabina = camaraEnCabina;
	}

void Escena::ponerCamaraEnCabina()
	{
	/*this->camara->setEye(0.0,0.0,15.0+CAMARA_H);
	this->camara->setCentre(0.0,0.0,15.0);
	this->camara->setUp(1.0,0.0,0.0);*/
	int velAngRppal =this->ruedaPrincipal->getVelAngular();
	int velAngRsec =this->ruedaPrincipal->getRuedaSecundaria(0)->getVelAngular();
	GLfloat anguloRppal = velAngRppal * tiempoDurEscena * PI / 180;
	GLfloat anguloRsec = velAngRsec * tiempoDurEscena * PI / 180;
	GLfloat radioRppal =this->ruedaPrincipal->getRadioRueda();
	GLfloat radioRsec =this->ruedaPrincipal->getRuedaSecundaria(0)->getRadioRueda();

	this->camara->setEye(radioRsec*cos(anguloRsec) + radioRppal*cos(anguloRppal), 0, radioRsec*cos(anguloRsec) + radioRppal*cos(anguloRppal) + this->soporte->getAlturaPie());
	this->camara->setCentre(0.0,0.0,this->soporte->getAlturaPie());
	this->camara->setUp(0.0,0.0,1.0);
	this->ruedaPrincipal->getRuedaSecundaria(0)->getCabina(0)->ponerCamara(this->camara);
	this->camaraEnCabina = true;
	
	}

void Escena::sacarCamaraDeCabina()
	{
	this->camara->setEye(EYE_0,EYE_1,EYE_2);
	this->camara->setCentre(CENTRE_0,CENTRE_1,CENTRE_2);
	this->camara->setUp(UP_0,UP_1,UP_2);
	this->ruedaPrincipal->getRuedaSecundaria(0)->getCabina(0)->quitarCamara();
	this->camaraEnCabina = false;
	}

void Escena::dibujar(int tiempoDurEscena)
	{
	//glPushMatrix();
	if (this->camaraEnCabina)
		{
		
		int velAngRppal =this->ruedaPrincipal->getVelAngular();
		int velAngRsec =this->ruedaPrincipal->getRuedaSecundaria(0)->getVelAngular();
		GLfloat anguloRppal = velAngRppal * tiempoDurEscena * PI / 180;
		GLfloat anguloRsec = velAngRsec * tiempoDurEscena * PI / 180;
		GLfloat radioRppal =this->ruedaPrincipal->getRadioRueda();
		GLfloat radioRsec =this->ruedaPrincipal->getRuedaSecundaria(0)->getRadioRueda();
		
		this->camara->setEye(radioRsec*cos(anguloRsec) + radioRppal*sin(anguloRppal), 0, radioRsec*sin(anguloRsec) + radioRppal*cos(anguloRppal) + this->soporte->getAlturaPie());
		this->camara->setCentre(0.0,0.0,this->soporte->getAlturaPie());
		this->camara->setUp(0.0,0.0,1.0);
		this->ruedaPrincipal->getRuedaSecundaria(0)->getCabina(0)->ponerCamara(this->camara);
		this->ruedaPrincipal->getRuedaSecundaria(0)->getCabina(0)->getCamara()->lookat();
		}
	else
		{
		/*this->camara->setEye(EYE_0,EYE_1,EYE_2);
		this->camara->setCentre(CENTRE_0,CENTRE_1,CENTRE_2);
		this->camara->setUp(UP_0,UP_1,UP_2);*/
		this->camara->lookat();
		}

	glPushMatrix();
	glTranslatef(0.0, (this->soporte->getAlturaPie()*tan(this->soporte->getAnguloPie()*PI/180)/2), this->soporte->getAlturaPie());
	//glRotatef((this->getRuedaPrincipal()->getVelAngular()*this->tiempoDurEscena)*PI/180, 0.0, 1.0, 0.0);
	//glRotatef(90, 1.0, 0.0, 0.0);
	this->ruedaPrincipal->dibujar(this->tiempoDurEscena);
	glPopMatrix();

	glPushMatrix();
	this->soporte->dibujar(this->tiempoDurEscena);
	glPopMatrix();

	//glPopMatrix();
	glutPostRedisplay();
	}

Camara* Escena::getCamara()
	{
	return this->camara;
	}

RuedaPrincipal* Escena::getRuedaPrincipal() {
	return this->ruedaPrincipal;
}